/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-24 21:42:47
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-25 12:28:53
 * @FilePath: /lesson20/pthread.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#include <iostream>
#include <string>

using namespace std;

#include <unistd.h>
#include <pthread.h>

#include<cassert>

#include"thread.hpp"
#include"lockGuard.hpp"



int tickets = 1000; // 表示有这么多票

pthread_mutex_t mutex;

void *threadRoutine(void *args)
{
    string name = static_cast<const char *>(args);
    while (true)
    {
        {
            LockGuard lockguard(&mutex);//RAII 风格的锁
            if (tickets > 0) // 表示有票
            {
                usleep(200); // 开始抢票前的工作
                cout << name << " get a ticket:" << tickets-- << endl;
            }
            else
            {

                break;
            }
        }
        usleep(100);
    }
}

int main()
{
    pthread_mutex_init(&mutex,nullptr);
    thread t1(1, threadRoutine, (void *)"hellozxj1");
    thread t2(2, threadRoutine, (void *)"hellozxj2");
    thread t3(3, threadRoutine, (void *)"hellozxj3");
    thread t4(4, threadRoutine, (void *)"hellozxj4");

    t1.run();
    t2.run();
    t3.run();
    t4.run();

    t1.join();
    t2.join();
    t3.join();
    t4.join();
    pthread_mutex_destroy(&mutex);
}


// void threadRun(void *args)
// {
//     std::string message = static_cast<const char *>(args);
//     int cnt = 10;
//     while (cnt)
//     {
//         cout << "我是一个线程, " << message << ", cnt: " << cnt-- << endl;
//         sleep(1);
//     }
// }


// int main()
// {
//     thread t1(1,threadRun,(void*)"hello zxj");
//     cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
//     t1.run();
//     cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
//     t1.join();
//     cout << "thread name: " << t1.threadname() << " thread id: " << t1.threadid() << ",thread status: " << t1.status() << std::endl;
//     return 0;
// }










// int tickets = 1000; // 表示有这么多票

// pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

// void *threadRoutine(void *args)
// {
//     string name = static_cast<const char *>(args);
//     while (true)
//     {
//         int ret=pthread_mutex_lock(&mutex);
//         assert(ret==0);
//         (void)ret;
//         if (tickets > 0) // 表示有票
//         {
//             usleep(200); // 开始抢票前的工作
//             cout << name << " get a ticket:" << tickets-- << endl;
//             ret=pthread_mutex_unlock(&mutex);
//             assert(ret==0);
//         }
//         else
//         {
//             ret=pthread_mutex_unlock(&mutex);
//             assert(ret==0);
//             break;
//         }
//         usleep(100);
//     }
// }

// int main()
// {
//     //pthread_mutex_init(&mutex,nullptr);
//     pthread_t t[4]; // 四个线程模拟四个用户
//     int n = sizeof(t) / sizeof(t[0]);
//     for (int i = 0; i < n; ++i)
//     {
//         char *name = new char[64];
//         snprintf(name, 64, "thread:%d ", i + 1);
//         pthread_create(t + i, nullptr, threadRoutine, (void *)name);
//     }

//     for (int i = 0; i < n; ++i)
//     {
//         pthread_join(t[i], nullptr);
//     }

//     //pthread_mutex_destroy(&mutex);

//     return 0;
// }